package com.atguigu.java;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import org.junit.Test;

/*
 * 处理流之二：转换流的使用
 * 1.InputStreamReader:将一个输入型的字节流转换为输入型的字符流
 *   OutputStreamWriter:将一个输出型的字符流转换为输出型的字节流
 * 
 * 2.解码：字节数组--->字符数组、字符串 。对应着InputStreamReader
 *   编码：字符数组、字符串 --->字节数组。对应着OutputStreamWriter
 *   
 * 3. 解码，对应着解码集。编码，对应着编码集。可以统一称为：字符集。
 * ASCII：美国标准信息交换码。
 * 用一个字节的7位可以表示。
 * 
 * ISO8859-1：拉丁码表。欧洲码表
 * 用一个字节的8位表示。
 * 
 * GB2312：中国的中文编码表。
 * 
 * GBK：中国的中文编码表升级，融合了更多的中文文字符号。
 * 
 * Unicode：国际标准码，融合了多种文字。
 * 所有文字都用两个字节来表示,Java语言使用的就是unicode
 * 
 * UTF-8：最多用三个字节来表示一个字符。
 * 
 * 	
 */
public class StreamReaderWriterTest {

	// 将使用GBK编码方式写出的文件，读入内存，并以UTF-8的方式存储为另外一个文件
	@Test
	public void testInputStreamReader2() throws Exception {
		// 1.
		File file1 = new File("dbcp_gbk.txt");
		File file2 = new File("dbcp_utf-8.txt");
		// 2.
		FileInputStream fis = new FileInputStream(file1);
		FileOutputStream fos = new FileOutputStream(file2);
		// 解码的过程
		InputStreamReader isr = new InputStreamReader(fis, "GBK");
		OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
		// 3.
		char[] cbuf = new char[20];
		int len;
		while ((len = isr.read(cbuf)) != -1) {
			osw.write(cbuf, 0, len);
		}
		// 4.
		isr.close();
		osw.close();
	}

	@Test
	public void testInputStreamReader1() throws Exception {
		// 1.
		File file = new File("dbcp_gbk.txt");
		// 2.
		FileInputStream fis = new FileInputStream(file);
		// 解码的过程
		InputStreamReader isr = new InputStreamReader(fis, "GBK");
		// 3.
		char[] cbuf = new char[20];
		int len;
		while ((len = isr.read(cbuf)) != -1) {
			String str = new String(cbuf, 0, len);
			System.out.print(str);
		}
		// 4.
		isr.close();
	}

}
